// 导入axios实例
import axios from 'axios';

// 导入一些常量
import {MC_MANAGE_HOST} from '@/const';
import {ElMessage} from "element-plus";
import router from "@/router";

/* =============== Axios实例配置 =============== */
// 创建Axios实例: 配置请求前缀和超时时间
export const MC_MANAGE_AXIOS = axios.create({
    baseURL: `${MC_MANAGE_HOST}/api/v1`,
    timeout: 5000
});

/* =============== 拦截器 =============== */

// 在发送请求前执行
MC_MANAGE_AXIOS.interceptors.request.use(
    // 正常时执行该函数，req为当前请求对象
    req => {
        // 统一打印请求数据，便于测试，生产时删除
        console.log('拦截到请求: ', req);
        // 从sessionStorage中获取Token令牌
        let token = sessionStorage.getItem("token");
        // 若Token令牌存在，则将Token令牌存入请求头
        if (token) req.headers['token'] = token;
        // 无论Token是否获取成功，都放行请求
        return req;
    },
    // 异常时执行该函数，e为异常对象: 异常时阻止该响应并展示异常信息
    err => Promise.reject(err)
);

// 在接收到响应之后执行
MC_MANAGE_AXIOS.interceptors.response.use(
    // 正常时执行该函数，req为当前请求对象
    resp => {
        // 统一打印响应数据，便于测试，生产时删除
        console.log('拦截到响应: ', resp);
        // 判断需要对Token进行续期: 约定Token即将过期时后台会返回一个 `code=1002` 的响应
        if (resp.data.code === 1002) {
            console.log(" >> Token自动续期-开始，原Token: {}", sessionStorage.getItem("token"));
            // 从响应中获取新的Token令牌
            let newToken = resp.data.data;
            // 更新sessionStorage中的Token令牌
            sessionStorage.setItem("token", newToken);
            // 将新的Token令牌设置到请求头
            MC_MANAGE_AXIOS.defaults.headers['token'] = newToken;
            console.log(" >> Token自动续期-结束，新Token: {}", newToken);
            // 携带新Token重新发送请求
            return MC_MANAGE_AXIOS.request(resp.config);
        }
        // 若不需要Token续期，则直接放行请求
        return resp;
    },
    // 异常时执行该函数，e为异常对象: 异常时阻止该响应并展示异常信息
    err => Promise.reject(err)
);
// GET - 下载Excel报表
export function excelApi(url, fileName) {
    // 自动拼接后缀
    if(!fileName.endsWith('.xlsx')){
        fileName += '.xlsx';
    }
    return MC_MANAGE_AXIOS.get(url,{
        responseType: 'blob'
    }).then(res => {
        let url = URL.createObjectURL(new Blob([res.data]));
        // 借助超链接标签完成下载功能
        let a = document.createElement('a');
        a.style.display = 'none';
        a.href = url;
        a.setAttribute('download', fileName);
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
        a = null;
    });
}